// File:       streambuf.c++
// Version:    1.00
// Author:     (c) Miles Sabin, 1997
// Purpose:    approximation to ANSI C++ streambuf

// Change log:
//  12/02/97   v. 1.00

#include "streambuf.h"


// Implementation of basic_streambuf_char

basic_streambuf_char::basic_streambuf_char()
  : gbeg_(0),
    gnext_(0),
    gend_(0),
    pbeg_(0),
    pnext_(0),
    pend_(0)
  {}

basic_streambuf_char::~basic_streambuf_char()
  {}

inline bool basic_streambuf_char::gavail() const
  { return gnext_ < gend_; }

inline bool basic_streambuf_char::pavail() const
  { return pnext_ < pend_; }

inline bool basic_streambuf_char::pbavail() const
  { return pnext_ > pbeg_; }

int basic_streambuf_char::in_avail()
  { return (gavail() ? gend_-gnext_ : showmanyc()); }

int basic_streambuf_char::snextc()
  { return (sbumpc() == traits::eof() ? traits::eof() : sgetc()); }

int basic_streambuf_char::sbumpc()
  { return (gavail() ? *gnext_++ : uflow()); }

int basic_streambuf_char::sgetc()
  { return (gavail() ? *gnext_ : underflow()); }

int basic_streambuf_char::sputbackc(char c)
  { return (pbavail() && c == *(gnext_-1) ? *--gnext_ : pbackfail(c)); }

int basic_streambuf_char::sungetc()
  { return (pbavail() ? *--gnext_ : pbackfail()); }

int basic_streambuf_char::sputc(char c)
  { return (pavail() ? *pnext_++ = c : overflow(c)); }

basic_streambuf_char* basic_streambuf_char::setbuf(char*, streamsize)
  { return this; }

int basic_streambuf_char::seekoff(int, ios::seekdir, ios::openmode)
  { return -1; }

int basic_streambuf_char::seekpos(int, ios::openmode)
  { return -1; }

int basic_streambuf_char::sync()
  { return 0; }

int basic_streambuf_char::showmanyc()
  { return 0; }

streamsize basic_streambuf_char::xsgetn(char* s, streamsize n)
  {
    char c;
    streamsize bump_count;
    for(bump_count = 0; bump_count < n && (c = sbumpc()) != traits::eof(); ++bump_count)
      *s++ = c;

    return bump_count;
  }

int basic_streambuf_char::underflow()
  { return traits::eof(); }

int basic_streambuf_char::uflow()
  { return (underflow() == traits::eof() ? traits::eof() : *gnext_++); }

int basic_streambuf_char::pbackfail(int)
  { return traits::eof(); }

streamsize basic_streambuf_char::xsputn(char const* s, streamsize n)
  {
    streamsize put_count;
    for(put_count = 0; put_count < n && sputc(*s++) != traits::eof(); ++put_count);

    return put_count;
  }

int basic_streambuf_char::overflow(int)
  { return traits::eof(); }

void basic_streambuf_char::sync_stdio_with_stream()
  {}

void basic_streambuf_char::sync_stream_with_stdio()
  {}

